// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 初始化数据库
const db = cloud.database();

// 查询数据
const getRubber = async () => {
  // 返回数据库查询结果
  return await db.collection("rubber")
        .aggregate() // 使用聚合管道
        .lookup({
            from: 'brand', // 需要关联的表的名称，例如存储品牌信息的表叫 'brand'
            localField: 'brand', // rubber 表中的关联字段，存储的是品牌ID
            foreignField: '_id', // brand 表中被关联的字段，通常是 _id
            as: 'brandInfo' // 将关联查询到的品牌详细信息放入这个新字段中
        })
        .unwind('$brandInfo') // 将brandInfo数组展开为对象
        .project({
          _id: true,
          name: true,
        //   brand: true,
          brandName: '$brandInfo.name', // 将品牌名称映射到新的字段
        //   brandInfo: true,
          coverPath: true,
          position: true, 
          price: true,
          perf: true
        }).end();
};

// 查询胶皮信息带品牌
const getRubberById = async (id) => {
  // 返回数据库查询结果
  try {
    const result = await db.collection("rubber")
      .aggregate()
      .match({
        _id: id  // 使用 match 来筛选指定ID的文档
      })
      .lookup({
          from: 'brand',
          localField: 'brand', 
          foreignField: '_id',
          as: 'brandInfo'
      })
      .unwind({
        path: '$brandInfo',
        preserveNullAndEmptyArrays: true // 即使没有关联的品牌信息也保留主文档
      })
      .project({
          _id: true,
          brandName: '$brandInfo.name',
          name: true,
          coverPath: true,
          price: true,
          ttm: true,
          tags: true,
          perf: true,
          craftNote: true,
          description: true
      })
      .end();
    
    if (result.list && result.list.length > 0) {
        return result.list[0]; // 返回单个文档
    } else {
        return null; // 结果不存在
    }
  } catch (error) {
      console.error('查询失败:', error);
      throw error;
  }
};

// 查询按照品牌分类整合的胶皮
const getRubberGroupByBrand = async () => {
  // 返回数据库查询结果
  return await db.collection("rubber")
      .aggregate() // 使用聚合管道
      .lookup({
          from: 'brand', // 需要关联的表的名称，例如存储品牌信息的表叫 'brand'
          localField: 'brand', // Blade 表中的关联字段，存储的是品牌ID
          foreignField: '_id', // brand 表中被关联的字段，通常是 _id
          as: 'brandInfo' // 将关联查询到的品牌详细信息放入这个新字段中
      })
      .unwind('$brandInfo') // 将brandInfo数组展开为对象
      .group({
        _id: '$brandInfo.name', // 按品牌名称分组,分组之后隐藏该字段
        brandName: { $first: '$brandInfo.name' }, // 保留品牌名称
        rubbers: {
          $push: { // 将同一品牌的所有底板信息放入数组
            _id: '$_id',
            name: '$name',
          }
        },
        count: { $sum: 1 } // 统计每个品牌的胶皮数量
      })
      .project({
        _id: 0, // 不显示分组用的_id
        brandName: 1,
        rubbers: 1,
        count: 1
      })
      .end();
};

// 云函数入口函数
exports.main = async (event, context) => {
  switch (event.type) {
    case "getRubber":
      return await getRubber();
    case "getRubberById":
      return await getRubberById(event.id);
    case "getRubberGroupByBrand":
      return await getRubberGroupByBrand();
  }
}
